package org.com.behavioralPattern.observerPattern;

/**
 * 观察者模式
 * @author Jonny
 * @version 1.0
 * @Description:
 * @date 2021/4/27 16:41
 */

/**
 *优点
 * ■ 观察者和被观察者之间是抽象耦合。被观察者角色所知道的只是一个具体观察者集合，
 * 每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体的观察者，
 * 它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密的耦合在一起，
 * 因此它们可以属于不同的抽象化层次，且都非常容易扩展。
 * ■ 支持广播通信。被观察者会向所有登记过的观察者发出通知，这就是一个触发机制，形成一个触发链
 *
 * ■ 如果一个主题有多个直接或间接的观察者，则通知所有的观察者会花费很多时间，且开发和调试都比较复杂。
 * ■ 如果在主题之间有循环依赖，被观察者会触发它们之间进行循环调用，导致系统崩溃。在使用观察者模式时要特别注意这一点。
 * ■ 如果对观察者的通知是通过另外的线程进行异步投递，系统必须保证投递的顺序执行。
 * ■ 虽然观察者模式可以随时使观察者知道所观察的对象发生了变化，
 * 但是观察者模式没有提供相应的机制使观察者知道所观察的对象是如何发生变化。
 *
 * ■ 关联行为场景。
 * ■ 事件多级触发场景。
 * ■ 跨系统的消息交换场景，如消息队列的处理机制。
 *
 * 注意事项
 * ■ 广播链的问题。一个观察者可以有双重身份，既是观察者也是被观察者，广播链一旦建立，
 * 逻辑就比较复杂，可维护性非常差。一般在一个观察者模式中最多出现一个对象既是观察者也是被观察者，
 * 这样消息最多转发一次（传递两次），较易控制。
 *
 * ■ 异步处理的问题。异步处理就要考虑线程安全和队列的问题。
 * 注意观察者广播链和责任链模式的最大区别就是观察者广播链在传播的过程中，
 * 消息是随时更改的，是由相邻的两个节点协商的消息结构；
 * 而责任链模式在消息传递过程中，消息是保持不变的，
 * 如果要改变，也只有在原有消息上进行修正。
 *
 */
public class Test {
    public static void main(String[] args) {
        Button button=new Button();
        button.color="蓝色";
        button.x=0;
        button.y=0;
        button.AddClickableObserver(new ChangeColorObserver());
        button.AddClickableObserver(new ChangeCoordinateObserver());
        button.AddClickableObserver(new OtherObserver());
        button.click();
        System.out.println(button);
    }

}
